package org.pictual.business.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;
import org.pictual.business.dao.exceptions.DAOException;


public class MySqlSequenceGeneratorDAO implements SequenceGeneratorDAO{

	private Connection connection;
	private ResourceBundle queries=ResourceBundle.getBundle("org.pictual.business.dao.MySqlSequenceGeneratorDAO");
	protected static Logger log= Logger.getLogger(MySqlPalabraDAO.class);
	
	public MySqlSequenceGeneratorDAO(){}
	
	public MySqlSequenceGeneratorDAO(Connection connection){
		this.connection=connection;
	}
	/**
	 * AccesoBD
	 */
	public int getValorClave(String nombre) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		final String query=queries.getString("getValorClave");
		ResultSet rs=null;
		Integer valor = new Integer(0);
		
		try {
			rs = accesoBD.ejecutarConsulta(
					query, 
					nombre);
			
			if(rs!=null){
				while(rs.next()){
					valor = rs.getInt(1);
					
					log.info("Obtencion del nuevo valor "+valor+" para la sequence "+nombre);
				}
			}
			
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
			accesoBD.cerrarResultSet(rs);
		}
		
		return valor;
	}
	
	/**
	 * @deprecated
	 */
	public int getValorClave2(String nombre) throws DAOException {
		ResultSet rs=null;
		PreparedStatement ps=null;
		Integer valor = null;
		final String query=queries.getString("getValorClave");
		try {
			if(null == ps){ 
				if(connection==null) 
				ps= connection.prepareStatement(query);
				ps.setString(1, nombre);
				rs = ps.executeQuery();
				while(rs.next()){
					valor = rs.getInt(1);
					
					log.info("Obtencion del nuevo valor "+valor+" para la sequence "+nombre);
				}
			}

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally {
			try {
				rs.close();
				ps.close();
				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}
		
		return valor.intValue();
	}

	/**
	 * AccesoBD
	 */
	public void setValorClave(String nombre, int valor) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		String query =queries.getString("setValorClave");

		try {
			accesoBD.ejecutarActualizacion(
					query, 
					valor,
					nombre);
			
			log.info("Actualizacion a "+valor+" para la sequence "+nombre);

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
		}
		
	}
	
	/**
	 * @deprecated
	 */
	public void setValorClave2(String nombre, int valor) throws DAOException {
//		Map map = new HashMap();
//		map.put("id", id);
//		map.put("valor", String.valueOf(valor));
		
		String query =queries.getString("setValorClave");
		PreparedStatement ps=null;
		try {
			if(null == ps){
				ps=connection.prepareStatement(query);
				
				ps.setInt(1, valor);
				ps.setString(2, nombre);
				
				ps.executeUpdate();
				log.info("Actualizacion a "+valor+" para la sequence "+nombre);
			}
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		}  finally {
			try {
				ps.close();
				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}
	}

	public String generateId(String id) throws DAOException {
		String result=null;
//		AccesoBD accesoBD = new AccesoBD();

		log.info("id: "+id);
		int valor=getValorClave(id);
		log.info("valor: "+valor);
		result=String.valueOf(valor);
		log.info("result: "+result);
		
		valor=(valor==Integer.MAX_VALUE)?1:valor+1;
		log.info("valor: "+valor);
		setValorClave(id, valor);
		return result;
	}

}
